package com.hrm.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hrm.dto.Response;
import com.hrm.dto.ResponseDTO;
import com.hrm.entity.Staff;
import com.hrm.enums.BusinessStatusEnum;
import com.hrm.mapper.StaffMapper;
import com.hrm.util.JWTUtil;
import com.hrm.util.MD5Util;
import com.hrm.vo.StaffDeptVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
/*
这段代码是一个Java类，名为`LoginService`，继承自`ServiceImpl<StaffMapper, Staff>`。它实现了一个登录服务，用于验证用户身份并生成JWT（JSON Web Token）。
该类中定义了一个`StaffMapper`类型的成员变量`staffMapper`，用于访问数据库中的员工信息。
其中有两个方法：
1. `login(Staff staff)`方法：接收一个`Staff`对象作为参数，表示要登录的用户。
该方法首先将用户的密码进行MD5加密，然后调用`staffMapper`的`findStaffInfo`方法查询该用户的信息和部门信息。
如果查询结果不为空且用户状态为正常（status=1），则使用`JWTUtil.generateToken`方法生成一个token
并将用户信息和token一起返回。否则，返回错误信息。
2. `findByCode(String code)`方法：接收一个字符串类型的参数`code`，表示要查询的员工编码
该方法使用`QueryWrapper`构建查询条件，查询数据库中是否存在该员工编码对应的记录。
如果存在，则返回成功信息；否则，返回失败信息。
 */
/**
 * @author 杨骅麟
 * @since 2024
 */

@Service
public class LoginService extends ServiceImpl<StaffMapper, Staff> {

    @Resource
    private StaffMapper staffMapper;

    public ResponseDTO login(Staff staff) {
        String password = MD5Util.MD55(staff.getPassword());
        StaffDeptVO staffDeptVO = this.staffMapper.findStaffInfo(staff.getCode(), password);
        if (staffDeptVO != null) {
            // 验证用户状态
            if (staffDeptVO.getStatus() == 1) {
                String token = JWTUtil.generateToken(staffDeptVO.getId(),password);
                return Response.success(staffDeptVO, token); // 返回员工信息和token
            }
            return Response.error(BusinessStatusEnum.STAFF_STATUS_ERROR);
        }
        return Response.error("用户名或密码错误！");
    }


    public ResponseDTO findByCode(String code) {
        QueryWrapper<Staff> wrapper = new QueryWrapper<>();
        wrapper.eq("code", code);
        List<Staff> staffList = list(wrapper);
        if (staffList.size() > 0) {
            return Response.success();
        }
        return Response.error();
    }
}
